from abc import ABCMeta,abstractmethod

#抽象产品：让具体产品有同样的表现和使用
class Payment(metaclass=ABCMeta):
    #abstract class
    @abstractmethod
    def pay(self,money):
        pass
#具体产品
class Alipay(Payment):
    def __init__(self,use_huabei=False):
        self.use_huabei=use_huabei

    def pay(self,money):
        if self.use_huabei==True:
            print("花呗支付%d元"%money)
        else:
            print("支付宝余额支付%d元"%money)

class WechatPay(Payment):
    def pay(self,money):
        print("微信支付%d元"%money)

#工厂角色（Creator）
class PaymentFactory:
    def create_payment(self,method):
        if method=='alipay':
            return Alipay()
        elif method=='wechat':
            return WechatPay()
        elif method=="huabei":
            return Alipay(use_huabei=True)
        else:
            raise TypeError('No such class name %s'%method)
#client

pf=PaymentFactory()
p=pf.create_payment('huabei')
p.pay(100)